﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace CCL.SocketMessage.Request
{
    /// <summary>
    /// 프로젝트를 커밋하기 위해 서버를 준비시키는 Message의 Body를 제공합니다.
    /// </summary>
    public class CommitProject : Body
    {
        /// <summary>
        /// Project 고유 ID를 가져옵니다.
        /// </summary>
        public int ProjectID { get; private set; }

        /// <summary>
        /// Committer의 UserID를 가져옵니다.
        /// </summary>
        public int UserID { get; private set; }

        /// <summary>
        /// Commit에 남길 로그메시지를 가져옵니다.
        /// </summary>
        public string Log { get; private set; }

        /// <summary>
        /// 새로운 CommitProject 객체를 생성합니다.
        /// </summary>
        /// <param name="projId">Project 고유 ID</param>
        /// <param name="userId">User 고유 ID</param>
        /// <param name="log">해당 Revision에 남길 로그메시지</param>
        public CommitProject(int projId, int userId, string log)
        {
            ProjectID = projId;
            UserID = userId;
            Log = log;
        }

        /// <summary>
        /// 직렬화된 byte 배열을 통해 CommitProject 객체를 생성합니다.
        /// </summary>
        /// <param name="bytes">직렬화된 byte 배열</param>
        public CommitProject(byte[] bytes)
        {
            int start = 0;

            ProjectID = BitConverter.ToInt32(bytes, start);
            start += sizeof(Int32);

            UserID = BitConverter.ToInt32(bytes, start);
            start += sizeof(Int32);

            Log = Utility.StringUtility.ConvertToStr(Encoding.Default.GetChars(bytes, start, Constant.Length.Log));
            start += Constant.Length.Log;
        }

        /// <summary>
        /// 바이트 배열로 직렬화 합니다.
        /// </summary>
        /// <returns>직렬화된 바이트 배열</returns>
        public override byte[] GetByte()
        {
            byte[] bytes = new byte[GetSize()];

            byte[] temp;
            int start = 0;

            temp = BitConverter.GetBytes(ProjectID);
            Array.Copy(temp, 0, bytes, start, temp.Length);
            start += temp.Length;

            temp = BitConverter.GetBytes(UserID);
            Array.Copy(temp, 0, bytes, start, temp.Length);
            start += temp.Length;

            temp = Utility.StringUtility.StringToBytes(Log, Constant.Length.Log);
            Array.Copy(temp, 0, bytes, start, temp.Length);
            start += temp.Length;

            return bytes;
        }

        /// <summary>
        /// 직렬화 가능한 객체의 바이트 사이즈를 가져옵니다.
        /// </summary>
        /// <returns>직렬화된 바이트 사이즈</returns>
        public override uint GetSize()
        {
            uint size = 0;

            size += sizeof(int);
            size += sizeof(int);
            size += Constant.Length.Log;

            return size;
        }
    }
}
